import { defineStore } from 'pinia';
import { login as loginApi, userLogout } from '@/api/employee';
import {
  getToken,
  setToken,
  removeToken,
  getStoreId,
  setStoreId,
  removeStoreId,
  setUserInfo,
  getUserInfo,
  removeUserInfo,
} from '@/utils/cookies';
import Cookies from 'js-cookie';
import { ElMessage } from 'element-plus';
import router from '@/router'; // 导入 router 实例，用于登出后跳转

// 定义 User State 的 TypeScript 接口
export interface IUserState {
  token: string;
  name: string;
  avatar: string;
  storeId: string;
  introduction: string;
  userInfo: any; // 可以定义一个更具体的 IUserInfo 接口
  roles: string[];
  username: string;
}

// 使用 defineStore 创建一个名为 'user' 的 store
export const useUserStore = defineStore('user', {
  // state: 定义 store 的初始状态
  state: (): IUserState => ({
    token: getToken() || '',
    name: '',
    avatar: '',
    storeId: getStoreId() || '',
    introduction: '',
    userInfo: getUserInfo() ? JSON.parse(getUserInfo() as string) : {},
    roles: [],
    username: Cookies.get('username') || '',
  }),

  // actions: 定义所有业务逻辑方法
  actions: {
    /**
     * 用户登录
     * @param loginData 登录表单数据
     */
    async login(loginData: { username: string; password: string }) {
      const { username, password } = loginData;
      const trimmedUsername = username.trim();

      try {
        const response = await loginApi({ username: trimmedUsername, password });
        const userData = response.data;

        if (userData && userData.token) {
          // --- 登录成功 ---

          // 关键优化 1: 将状态设置逻辑封装成一个独立的函数
          this.setUserData(userData, trimmedUsername);

          return userData;
        } else {
          // --- 登录失败 ---
          const errorMessage = userData.msg || '登录失败，返回数据格式不正确';
          ElMessage.error(errorMessage);
          return Promise.reject(new Error(errorMessage));
        }
      } catch (error) {
        // 网络或其他请求错误
        ElMessage.error('网络请求失败，请检查后端服务是否正常');
        return Promise.reject(error);
      }
    },

    /**
     * 获取用户信息 (用于刷新页面、权限验证)
     */
    async getUserInfo() {
      if (!this.token) {
        throw new Error('GetUserInfo: token is undefined!');
      }

      // 如果 name 已经存在，说明用户信息已加载，直接返回
      if (this.name) {
          return this.userInfo;
      }

      const currentUserInfo = getUserInfo() ? JSON.parse(getUserInfo() as string) : null;

      if (!currentUserInfo) {
        // 如果 Cookie 中也没有用户信息，则强制登出
        await this.logout();
        throw new Error('Verification failed, please Login again.');
      }

      // 关键优化 2: 复用 setUserData 逻辑来填充 state
      this.setUserData(currentUserInfo, currentUserInfo.username);

      return currentUserInfo;
    },

    /**
     * 设置用户数据的私有辅助函数，用于 login 和 getUserInfo
     */
    setUserData(userData: any, username?: string) {
        this.token = userData.token || getToken() || '';
        this.userInfo = { ...userData };
        if (username) {
            this.username = username;
        }

        // 关键优化 3: 确保 name 和 roles 总是被填充
        this.name = userData.name || '';
        this.roles = userData.roles || [];
        this.avatar = userData.avatar || '';
        this.introduction = userData.introduction || '';

        // 更新 Cookies
        setToken(this.token);
        setUserInfo(JSON.stringify(this.userInfo));
        if (username) {
            Cookies.set('username', username);
        }
    },

    /**
     * 用户登出
     */
    async logout() {
      try {
        // 只有在存在 token 的情况下才调用后端登出接口
        if (this.token) {
          await userLogout();
        }
      } catch (error) {
        console.error('Logout API call failed:', error);
      } finally {
        // 关键优化 4: 登出后重置 state 到初始状态
        this.$reset();

        // 手动清理所有相关的 Cookies
        removeToken();
        removeStoreId();
        removeUserInfo();
        Cookies.remove('username');

        // 跳转到登录页
        // location.reload() 是一种更彻底的清理方式，可以防止旧的路由状态残留
        location.reload();
      }
    },

    // 其他 actions...
    // changeStore, resetToken 等可以保持原样
  },
});
